<?php
/**
 * @author		João Batista Neto
 * @brief		Classes e interfaces utilitárias
 * @package		rpo.util
 */

require_once 'rpo/base/IObject.php';

/**
 * @ingroup		MapReduce
 * @brief		Operação de mapeamento e redução de objetos
 * @interface	MapReduce
 */
interface MapReduce extends IObject {
	/**
	 * @brief	Efetua o mapeamento de um par chave-valor.
	 * @param	$key mixed Chave do mapeamento
	 * @param	$value mixed Valor do mapeamento
	 */
	public function map( $key , $value );

	/**
	 * @brief	Efetua uma operação de mapeamento e redução em todos os itens.
	 * @param	$map MapStep Objeto de mapeamento
	 * @param	$reduce ReduceStep Objeto de redução
	 * @return	Iterator
	 * @see		MapReduce.emit()
	 * @throws	LogicException Se o método MapReduce::map() não for chamado ao menos uma vez
	 */
	public function mapReduce( MapStep $map , ReduceStep $reduce );

	/**
	 * @brief	Efetua a redução de um valor relacionado com uma chave.
	 * @param	$key mixed Chave do mapeamento
	 * @param	$value mixed Valor reduzido
	 */
	public function reduce( $key , $value );
}